#!/bin/bash

# 定义日志文件路径
LOG_FILE="/home/git/lwf/project.git/hooks/post-receive.log"
export LOG_FILE  # 导出为环境变量，使子进程可以访问

# 使用nohup在后台运行脚本，避免被挂起
nohup bash -c "$(
    # 定义日志函数，将消息记录到日志文件并输出到标准输出
    log() {
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
        echo "$1"
    }
    
    # 检查/dev/sda1是否挂载到/mnt/sda1
    is_mounted() {
        findmnt -n -o TARGET "/dev/sda1" | grep -q "^/mnt/sda1$"
    }
    
    # 锁文件相关配置，用于防止脚本并发执行
    LOCKFILE="/tmp/lwfProjectGit.lock"
    TIMEOUT=10  # 获取锁的超时时间(秒)
    exec 200>"$LOCKFILE"  # 打开锁文件
    
    # 尝试获取锁，如果失败则退出
    if ! flock -w "$TIMEOUT" -n 200; then
        log "无法获取锁，另一个实例正在运行或等待超时"
        exit 1
    fi
    
    # Git仓库目录
    REPO_DIR="/home/git/lwf/project.git"
    
    # 根据是否挂载了/dev/sda1决定部署根目录
    if is_mounted && [ -d "/mnt/sda1/git/www" ]; then
        DEPLOY_ROOT="/mnt/sda1/git/www"  # 使用挂载的目录
    else
        DEPLOY_ROOT="/home/git/www"  # 使用默认目录
    fi
    
    # 需要部署的目标分支列表
    TARGET_BRANCHES=(
        "Linux-knowledge-miscellaneous-document"
        "ArtificialIntelligenceTrainer_BasicKnowledge"
        "manual"
        "images-show"
    )
    
    # 验证分支名是否合法(只包含字母、数字、下划线和连字符)
    is_valid_branch() {
        [[ "$1" =~ ^[a-zA-Z0-9_-]+$ ]]
    }
    
    # 处理推送事件的核心函数
    process_push() {
        # 读取标准输入，格式为: 旧版本 新版本 引用名
        while read oldrev newrev refname; do
            # 从引用名中提取分支名(格式为refs/heads/branch_name)
            branch=$(echo "$refname" | awk -F'/' '{print $3}')
            
            # 检查分支名是否合法
            if ! is_valid_branch "$branch"; then
                log "警告：分支名应该在 a-zA-Z0-9_- 范围，检测到可疑分支名 '$branch'，已忽略"
                continue  # 跳过不合法的分支
            fi
            
            # 检查是否是目标分支
            if [[ " ${TARGET_BRANCHES[@]} " =~ " ${branch} " ]]; then
                # 构建部署目录路径
                DEPLOY_DIR="${DEPLOY_ROOT}/${branch}"
                log "检测到分支 ${branch} 的推送 ${oldrev:0:7} → ${newrev:0:7} ，开始部署..."
                
                # 创建部署目录(如果不存在)
                mkdir -p "$DEPLOY_DIR" || {
                    log "错误：无法创建目录 ${DEPLOY_DIR}"
                    return 1
                }
                
                # 检出分支到部署目录
                if ! git --git-dir="$REPO_DIR" --work-tree="$DEPLOY_DIR" checkout -f "$branch"; then
                    log "错误：检出分支 ${branch} 失败！"
                    return 1
                fi
                
                # 设置文件和目录权限
                chown -R git:git "$DEPLOY_DIR"  # 递归修改所有者
                find "$DEPLOY_DIR" -type d -exec chmod 755 {} \;  # 目录权限755
                find "$DEPLOY_DIR" -type f -exec chmod 644 {} \;  # 文件权限644
                
                log "分支 ${branch} 已成功部署到 ${DEPLOY_DIR}"
                log "----------------------------------------"
            else
                log "忽略非目标分支 ${branch} 的推送"
            fi
        done
    }
    
    # 调用处理函数
    process_push
)"

# 脚本退出
exit 0